package com.own.component.common.base.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.own.component.common.base.entity.po.BaseBean;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * BaseMapper
 *
 * @author chenxueli
 * @date 2020/6/15 13:48
 */
public interface BaseMapper<T extends BaseBean> extends com.baomidou.mybatisplus.core.mapper.BaseMapper<T> {

    /**
     * 批量插入
     *
     * @param list 批量插入的列表信息
     * @return 影响行数
     */
    int insertBatch(@Param("list") List<T> list);

    /**
     * 忽略插入
     *
     * @param entity 实体对象
     */
    int insertIgnore(T entity);

    /**
     * 批量修改
     *
     * @param list 批量修改的列表信息
     * @return 影响行数
     */
    @SuppressWarnings("all")
    int updateByIdBatch(@Param("list") List<T> list);

    /**
     * 查询最大的序号
     *
     * @param wrapper 条件
     * @return 影响行数
     */
    int maxSortOrder(@Param("ew") Wrapper<T> wrapper);

    /**
     * 查询最小的序号
     *
     * @param wrapper 条件
     * @return 影响行数
     */
    int minSortOrder(@Param("ew") Wrapper<T> wrapper);

    /**
     * 递减序号
     *
     * @param sort    原排序序号
     * @param wrapper 条件
     * @return 影响行数
     */
    int updateDecreaseOrder(@Param("sort") Integer sort, @Param("ew") Wrapper<T> wrapper);

    /**
     * 递增序号
     *
     * @param sort    原排序序号
     * @param wrapper 条件
     * @return 影响行数
     */
    int updateIncreaseOrder(@Param("sort") Integer sort, @Param("ew") Wrapper<T> wrapper);

    /**
     * 根据 ID 修改
     *
     * @param entity 实体对象
     */
    int ignoreLogicDeleteUpdateById(@Param(Constants.ENTITY) T entity);

    /**
     * 根据 whereEntity 条件，更新记录，忽略逻辑字段
     *
     * @param entity        实体对象 (set 条件值,可以为 null)
     * @param updateWrapper 实体对象封装操作类（可以为 null,里面的 entity 用于生成 where 语句）
     */
    int ignoreLogicDeleteUpdate(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);

    /**
     * 根据 Wrapper 更新记录，忽略逻辑字段
     *
     * @param updateWrapper {@link UpdateWrapper} or {@link LambdaUpdateWrapper}
     * @since 3.5.4
     */
    default int ignoreLogicDeleteUpdate(@Param(Constants.WRAPPER) Wrapper<T> updateWrapper) {
        return ignoreLogicDeleteUpdate(null, updateWrapper);
    }

}
